package org.example.springboot_mybatisplus_s1.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.example.springboot_mybatisplus_s1.entity.User;
import org.example.springboot_mybatisplus_s1.mapper.Usermapper;
import org.example.springboot_mybatisplus_s1.service.Userservice;
import org.springframework.stereotype.Service;

import java.util.List;

//ServiceImpl<> 具备接口继承的IService所有方法
//<Usermapper,User> 泛型 里面写了UserMapper 指的是要通过这个Usermapper 去对数据库进行操作 连接DAO层
@Service
public class Userserviceimpl extends ServiceImpl<Usermapper,User> implements Userservice {
    //在业务层中写分页查询
    @Override
    public IPage<User> selectUserPage(Integer pageNum, Integer pageSize) {
        //new 一个内置的pege对象 这个对象是MP中自带的 专门用来存放关于分页的数据
        //比如 查看第几页  这个页中多少条数据
        IPage <User> page = new Page(pageNum, pageSize);//写完参数 得到一个Ipage类 <T> 泛型代表User类的集合
        //调用方法 将条件传递进去  这个page方法是 ServiceImpl自带的
         page(page,null);
        return page;
    }

    @Override
    public List<User> selectUserList(Integer gt,Integer lt) {
        //new 一个条件载体
        QueryWrapper<User> qw  = new QueryWrapper<>();

        //给载体中添加条件  一个字段 一个value  动态sql如果输入的值大于等于2 这个条件才生效
        qw.lt(lt>=2,"age",lt);
        qw.gt("age",gt);

        //调用带条件查询的方法
        List<User> list = baseMapper.selectList(qw);
        return list;
    }

    @Override
    public List<User> selectage(String name) {
        //创建一个 LambdaQueryWrapper<>  与 querywapper的区别是  可以帮助我们判定下字段是否正确
        LambdaQueryWrapper<User> LW = new LambdaQueryWrapper<>();
        //给容器添加条件 模糊查询 condition 判断条件是否成立  User::getName 使用拉姆达表达式来获取 类中的字段
        //后面让年龄降序排序
        LambdaQueryWrapper<User> userLambdaQueryWrapper = LW.like(true, User::getName, name).orderByDesc(User::getAge);
        List<User> list = list(userLambdaQueryWrapper);
        return list;
    }

    @Override
    public Integer getmax() { //分组  然后查询年龄最大的
        QueryWrapper<User> qw = new QueryWrapper<>();
                                                //这里设置别名 以防 空指针
        qw.groupBy("password").select("max(age) as age").last("limit 1");
        List<User> list = list(qw);
        Integer age = list.get(0).getAge();
        return age;
    }

    @Override
    public List<User> getage() {
        LambdaQueryWrapper<User> LM = new LambdaQueryWrapper<>();
        LM.eq(User::getAge, 100).or().eq(User::getAge, 23);
        List<User> list = list(LM);
        return list;

    }


}
